package in.partake.service.impl; import in.partake.base.TimeUtil; import in.partake.base.Util; import in.partake.model.dto.Event; import in.partake.model.dto.EventTicket; import in.partake.service.EventSearchServiceException; import in.partake.service.IEventSearchService; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.Field.TermVector; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; public class EventSearchService implements IEventSearchService { public EventSearchService() { } @Override public void initialize() throws EventSearchServiceException { LuceneService.initialize(); } @Override public void cleanUp() throws EventSearchServiceException { LuceneService.destroy(); } @Override public void create(Event event, List<EventTicket> tickets) throws EventSearchServiceException { Document doc = makeDocument(event, tickets); LuceneService.get().addDocument(doc); } @Override public boolean hasIndexed(String eventId) throws EventSearchServiceException { return LuceneService.get().hasDocument(eventId); } @Override public void remove(String eventId) throws EventSearchServiceException{ LuceneService.get().removeDocument(eventId); } @Override public void update(Event event, List<EventTicket> tickets) throws EventSearchServiceException { Document doc = makeDocument(event, tickets); LuceneService.get().updateDocument(doc); } @Override public void truncate() throws EventSearchServiceException { LuceneService.get().truncate(); } @Override public List<String> getUpcomingByCategory(String category, int maxDocument) throws EventSearchServiceException { try { TopDocs docs = LuceneService.get().search("", category, "beginDate", true, maxDocument); return convertToIds(docs, 0); } catch (ParseException e) { assert false; throw new EventSearchServiceException(e); } } @Override public List<String> getRecent(int maxDocument) throws EventSearchServiceException { TopDocs docs = LuceneService.get().getRecentDocuments(maxDocument); return convertToIds(docs, 0); } @Override public List<String> getRecentByCategory(String category, int maxDocument) throws EventSearchServiceException { TopDocs docs = LuceneService.get().getRecentCategoryDocuments(category, maxDocument); return convertToIds(docs, 0); } @Override public List<String> search(String term, String category, String sortOrder, boolean beforeDeadlineOnly, int offset, int limit) throws EventSearchServiceException { try { TopDocs docs = LuceneService.get().search(term, category, sortOrder, beforeDeadlineOnly, offset + limit); return convertToIds(docs, offset); } catch (ParseException e) { throw new EventSearchServiceException(e); } } @Override public List<String> search(String term, String category, String sortOrder, boolean beforeDeadlineOnly, int maxDocument) throws EventSearchServiceException { try { TopDocs docs = LuceneService.get().search(term, category, sortOrder, beforeDeadlineOnly, maxDocument); return convertToIds(docs, 0); } catch (ParseException e) { assert false; throw new EventSearchServiceException(e); } } private List<String> convertToIds(TopDocs docs, int offset) throws EventSearchServiceException { List<String> eventIds = new ArrayList<String>(); for (int i = offset; i < docs.scoreDocs.length; ++i) { ScoreDoc doc = docs.scoreDocs[i]; Document document = LuceneService.get().getDocument(doc.doc); String id = document.get("ID"); if (id == null) continue; eventIds.add(id); } return eventIds; } /** * create a lucene document from eventId and event. */ private Document makeDocument(Event event, List<EventTicket> tickets) { StringBuilder builder = new StringBuilder(); builder.append(event.getTitle()).append(" "); builder.append(event.getSummary()).append(" "); builder.append(event.getAddress()).append(" "); builder.append(event.getPlace()).append(" "); builder.append(Util.removeTags(event.getDescription())); long beginTime = event.getBeginDate().getTime(); long deadlineTime = event.acceptsSomeTicketsTill(tickets).getTime(); Document doc = new Document(); doc.add(new Field("ID", event.getId(), Store.YES, Index.NOT_ANALYZED)); doc.add(new Field("CATEGORY", event.getCategory(), Store.NO, Index.NOT_ANALYZED, TermVector.WITH_POSITIONS)); doc.add(new Field("CREATED-AT", TimeUtil.getTimeString(event.getCreatedAt().getTime()), Store.NO, Index.NOT_ANALYZED)); doc.add(new Field("BEGIN-TIME", TimeUtil.getTimeString(beginTime), Store.NO, Index.NOT_ANALYZED)); doc.add(new Field("DEADLINE-TIME", TimeUtil.getTimeString(deadlineTime), Store.NO, Index.NOT_ANALYZED)); doc.add(new Field("TITLE", event.getTitle(), Store.NO, Index.ANALYZED, TermVector.WITH_POSITIONS)); doc.add(new Field("CONTENT", builder.toString(), Store.NO, Index.ANALYZED, TermVector.WITH_POSITIONS)); return doc; } }